package com.vegetable.modules.entity.baseData;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;

import java.io.Serializable;
import java.util.Date;
import java.util.List;

/**
 * 发票识别结果顶层实体
 */
@Data
public class InvoiceInfo implements Serializable {

        private static final long serialVersionUID = 1L;

        @ApiModelProperty("主键id")
        @JsonSerialize(using = ToStringSerializer.class)
        @TableId(value = "id", type = IdType.AUTO)
        private Long id;
        // =============== 基础信息部分 ===============
        /** 购买方地址 */
        @ApiModelProperty("PurchaserAddress")
        private String purchaserAddress;

        /** 购买方开户银行 */
        @ApiModelProperty("PurchaserBank")
        private String purchaserBank;

        @ApiModelProperty("purchaserBankAccount")
        private String purchaserBankAccount;

        /** 发票密码 */
        @ApiModelProperty("Password")
        private String password;

        /** 销售方统一社会信用代码 */
        @ApiModelProperty("SellerRegisterNum")
        private String sellerRegisterNum;

        /** 销售方开户银行 */
        @ApiModelProperty("SellerBank")
        private String sellerBank;

        private String sellerBankAccount;

        /** 发票类型 */
        @ApiModelProperty("InvoiceType")
        private String invoiceType;

        /** 价税合计（大写） */
        @ApiModelProperty("AmountInWords")
        private String amountInWords;

        /** 合计税额（通常为"***"） */
        @ApiModelProperty("TotalTax")
        private String totalTax;

        /** 机器编号 */
        @ApiModelProperty("MachineCode")
        private String machineCode;

        /** 城市 */
        @ApiModelProperty("City")
        private String city;

        /** 发票号码（数字部分） */
        @ApiModelProperty("InvoiceNumDigit")
        private String invoiceNumDigit;

        /** 复核人 */
        @ApiModelProperty("Checker")
        private String checker;

        /** 发票代码 */
        @ApiModelProperty("InvoiceCode")
        private String invoiceCode;

        /** 销售方地址 */
        @ApiModelProperty("SellerAddress")
        private String sellerAddress;

        /** 开票人 */
        @ApiModelProperty("NoteDrawer")
        private String noteDrawer;

        /** 省份 */
        @ApiModelProperty("Province")
        private String province;

        /** 发票号码（全称） */
        @ApiModelProperty("InvoiceNum")
        private String invoiceNum;

        /** 服务类型/行业分类 */
        @ApiModelProperty("ServiceType")
        private String serviceType;

        /** 开票日期 */
        @ApiModelProperty("InvoiceDate")
        @DateTimeFormat(pattern = "yyyy-MM-dd")
        @JsonFormat(locale = "zh", timezone = "GMT+8", pattern = "yyyy-MM-dd")
        private Date invoiceDate;

        /** 购买方统一社会信用代码 */
        @ApiModelProperty("PurchaserRegisterNum")
        private String purchaserRegisterNum;

        /** 价税合计（小写） */
        @ApiModelProperty("TotalAmount")
        private String totalAmount;

        /** 分单号 */
        @ApiModelProperty("SheetNum")
        private String sheetNum;

        /** 购买方名称 */
        @ApiModelProperty("PurchaserName")
        private String purchaserName;

        /** 销售方名称 */
        @ApiModelProperty("SellerName")
        private String sellerName;

        /** 确认的发票号码 */
        @ApiModelProperty("InvoiceNumConfirm")
        private String invoiceNumConfirm;

        /** 是否代办（"是"/"否"） */
        @ApiModelProperty("Agent")
        private String agent;

        /** 发票标签 */
        @ApiModelProperty("InvoiceTag")
        private String invoiceTag;

        /** 校验码 */
        @ApiModelProperty("CheckCode")
        private String checkCode;

        /** 原始发票类型 */
        @ApiModelProperty("InvoiceTypeOrg")
        private String invoiceTypeOrg;

        /** 备注信息（包含银行账号等） */
        @ApiModelProperty("Remarks")
        private String remarks;

        /** 收款人 */
        @ApiModelProperty("Payee")
        private String payee;

        /** 价税合计（数字） */
        @ApiModelProperty("AmountInFiguers")
        private String amountInFiguers;

        /** 是否在线支付 */
        @ApiModelProperty("OnlinePay")
        private String onlinePay;

        // =============== 商品明细部分 ===============
        /** 商品车辆类型 */
        @TableField(exist = false)
        @ApiModelProperty("CommodityVehicleType")
        private List<String> commodityVehicleType;

        /** 商品数量（带行号） */
        @TableField(exist = false)
        @ApiModelProperty("CommodityNum")
        private List<RowWord> commodityNum;

        /** 商品金额（带行号） */
        @TableField(exist = false)
        @ApiModelProperty("CommodityAmount")
        private List<RowWord> commodityAmount;

        /** 商品单价（带行号） */
        @TableField(exist = false)
        @ApiModelProperty("CommodityPrice")
        private List<RowWord> commodityPrice;

        /** 商品税率（带行号） */
        @TableField(exist = false)
        @ApiModelProperty("CommodityTaxRate")
        private List<RowWord> commodityTaxRate;

        /** 商品车牌号码 */
        @TableField(exist = false)
        @ApiModelProperty("CommodityPlateNum")
        private List<String> commodityPlateNum;

        /** 商品单位（带行号） */
        @TableField(exist = false)
        @ApiModelProperty("CommodityUnit")
        private List<RowWord> commodityUnit;

        /** 商品税额（带行号） */
        @TableField(exist = false)
        @ApiModelProperty("CommodityTax")
        private List<RowWord> commodityTax;

        /** 商品名称（带行号） */
        @TableField(exist = false)
        @ApiModelProperty("CommodityName")
        private List<RowWord> commodityName;

        /** 商品类型 */
        @TableField(exist = false)
        @ApiModelProperty("CommodityType")
        private List<String> commodityType;

        /** 商品有效期截止日期 */
        @TableField(exist = false)
        @ApiModelProperty("CommodityEndDate")
        private List<String> commodityEndDate;

        /** 商品有效期起始日期 */
        @TableField(exist = false)
        @ApiModelProperty("CommodityStartDate")
        private List<String> commodityStartDate;

        /** 商品明细列表 */
        @TableField(exist = false)
        @ApiModelProperty("发票商品明细列表")
        private List<InvoiceItem> invoiceItems;

        /**
         * 带行号的键值对对象（用于商品明细行）
         */
        @Data
        public static class RowWord {
            /** 行号（从1开始） */
            @ApiModelProperty("row")
            private String row;

            /** 对应值 */
            @ApiModelProperty("word")
            private String word;
        }

        @ApiModelProperty(value = "发票原文附件")
        private String orderImage;

        @ApiModelProperty("客户、农户id")
        private Long abId;

        @TableField(exist = false)
        @ApiModelProperty("关联系统人员姓名")
        private String abName;

        @TableField(exist = false)
        @ApiModelProperty("人员类型：0农户，1客商，2代办，3班组")
        private Integer staffType;

}